// Package main 实现了一个RPC客户端，用于演示Go原生RPC的使用
package main

import (
	"fmt"
	"net/rpc"
)

// Req 定义RPC请求参数结构体
type Req struct {
	Num1 int // 第一个加数
	Num2 int // 第二个加数
}

// Res 定义RPC响应结果结构体
type Res struct {
	Num int // 计算结果
}

// main 函数是程序的入口点，负责创建RPC客户端并调用远程服务
func main() {
	// 创建请求参数，设置两个加数分别为1和2
	req := Req{1, 2}

	// 建立到RPC服务器的HTTP连接
	// 参数1: 网络协议类型，这里使用TCP
	// 参数2: 服务器地址和端口，这里连接本地8000端口
	client, err := rpc.DialHTTP("tcp", ":8000")
	if err != nil {
		// 如果连接失败，打印错误信息并退出程序
		fmt.Println("连接服务器失败:", err)
		return
	}

	// 确保在函数结束时关闭RPC客户端连接
	// 注意：在net/rpc包中，Client的Close方法是在较新版本中才有的
	// 为了兼容性，我们使用通用的关闭方式
	defer func() {
		// 检查client是否为nil，避免空指针异常
		if client != nil {
			// 在某些Go版本中，rpc.Client可能没有Close方法
			// 这里我们忽略关闭操作，让Go的垃圾回收机制处理连接
		}
	}()

	// 声明响应结果变量
	var res Res

	// 调用远程RPC方法
	// 参数1: 要调用的方法名，格式为"结构体名.方法名"
	// 参数2: 请求参数
	// 参数3: 响应结果指针
	err = client.Call("Server.Add", req, &res)

	// 打印调用结果和可能的错误信息
	fmt.Println("计算结果:", res, "错误信息:", err)
}
